﻿using System;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Controls;
using System.Diagnostics;
using System.Windows.Media.Imaging;
using Entidades;
using Excepciones;
using Negocio;
using DAO;
using LisBioGUIWPF.util;
using System.Collections.Generic;
using LisBioGUIWPF.GuiFunctions;

namespace LisBioGUIWPF.Controls.User
{    
    [LisBioException]
    public partial class UserData : System.Windows.Controls.UserControl
    {
        private LisBio lisBio;
        private string fileName;
        private InvestigadorControl investigadorControl;

        List<EntidadBase> barrios = new List<EntidadBase>();
        List<EntidadPerfil> perfiles;

        public enum Operacion
        { 
            NUEVO, ELIMINAR, MODIFICAR, ASISTENCIA, DETALLES
        }

        private Operacion operacion;
        private ReglaBase.Operacion operRegla;
        private EntidadInvestigador usuario;
        private EntidadAsistencia entAsistencia;

        public UserData(LisBio lisBio, Operacion operacion, InvestigadorControl investigadorControl)
        {
            InitializeComponent();
            this.lisBio = lisBio;
            this.operacion = operacion;
            this.investigadorControl = investigadorControl;

            this.Loaded += new RoutedEventHandler(UserData_Loaded);
            
            switch (operacion)
            {
                case Operacion.NUEVO:
                    this.tabDatos.Header = "Nuevo Investigador";
                    this.tabAsistencia.Visibility = Visibility.Hidden;
                    this.tabCarga.Visibility = Visibility.Hidden;
                    this.operRegla = ReglaBase.Operacion.INSERT; break;
                case Operacion.MODIFICAR:
                    this.tabDatos.Header = "Modificar Investigador";
                    this.tabAsistencia.Visibility = Visibility.Hidden;
                    this.tabCarga.Visibility = Visibility.Hidden;
                    this.operRegla = ReglaBase.Operacion.UPDATE; break;
                case Operacion.ELIMINAR:
                    this.tabDatos.Header = "Eliminar Investigador";
                    this.btnGuardar.Content = "Eliminar";
                    this.bloquear();
                    this.tabAsistencia.Visibility = Visibility.Hidden;
                    this.tabCarga.Visibility = Visibility.Hidden;
                    this.operRegla = ReglaBase.Operacion.DELETE; break;
                case Operacion.ASISTENCIA:
                    this.tabDatos.Visibility = Visibility.Hidden;
                    this.tabProyectos.Visibility = Visibility.Hidden;
                    this.tabControl.SelectedItem = this.tabAsistencia;
                    break;
                case Operacion.DETALLES:
                    this.tabDatos.Header = "Detalles Investigador";
                    this.btnGuardar.Content = "Cerrar";
                    this.btnSalidaRapida.Visibility = Visibility.Visible;
                    this.btnCancel.Visibility = Visibility.Hidden;
                    this.btnAgregar.Visibility = Visibility.Hidden;
                    this.tabCarga.Visibility = Visibility.Hidden;
                    this.bloquear();
                    this.tabAsistencia.Visibility = Visibility.Hidden;
                    break;
            }
            this.listarBarrios();
            perfiles = new List<EntidadPerfil>();

            CargarComponente.cargarProyectosCombo(this.comboProyecto);
            CargarComponente.cargarProyectosCombo(this.comboProyectoAsistencia);
            this.comboProyecto.SelectionChanged += new SelectionChangedEventHandler(comboProyecto_SelectionChanged);
        }

        void comboProyecto_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            this.ComboPerfil.IsEnabled = true;
            this.ComboPerfil.Items.Clear();
            EntidadProyecto proyecto = (EntidadProyecto) this.comboProyecto.SelectedItem;
            PerfilDAO perfilDao = new PerfilDAO();
            List<EntidadBase> lista = perfilDao.searchByProject(proyecto);

            if (lista != null)
            {
                foreach (EntidadBase entidad in lista)
                {
                    this.ComboPerfil.Items.Add((EntidadPerfil)entidad);
                }

                this.ComboPerfil.DisplayMemberPath = "Nombre";
                this.ComboPerfil.SelectedValuePath = "Id";
            }
            else
            {
                this.ComboPerfil.IsEnabled = false;
            }
        }

        void UserData_Loaded(object sender, RoutedEventArgs e)
        {
            this.txtNombre.Focus();
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            ImageControl image = new ImageControl(this.lisBio);
            image.setDefaultImage();
            this.lisBio.borderHuella.Child = image;
            
            //Listando nuevamente el combo para que se obtengan los investigadores con los datos actualizados
            if (this.operacion != Operacion.DETALLES)
            {
                this.lisBio.borderControles.Child.IsEnabled = true;
                this.investigadorControl.listarInvestigadores();
            }
        }

        private bool checkData()
        {
            if (txtNombre.Text.Length > 0 && txtDNI.Text.Length > 0 && txtLegajo.Text.Length > 0)
            {
                return true;
            }

            return false;
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            if (!this.checkData())
            {
                System.Windows.MessageBox.Show("Faltan completar algunos Datos.", "Datos Incorrectos");
            }
            else if (this.operacion == Operacion.DETALLES)
            {
                ImageControl image = new ImageControl(this.lisBio);
                image.setDefaultImage();
                this.lisBio.borderHuella.Child = image;
            }
            else
            {
                string imagePath = System.IO.Path.Combine(this.lisBio.PathImages, "MazeNL77.png");
                if (this.fileName != null && this.fileName != "")
                {
                    @imagePath = util.Util.obtainImageURL(this.fileName, this.lisBio.PathImages);
                }

                EntidadBarrio barrio = new EntidadBarrio();
                if (comboBarrio.SelectedIndex > -1)
                {
                    barrio.Id = (int)comboBarrio.SelectedValue;
                }

                EntidadInvestigador investigador = new EntidadInvestigador(txtNombre.Text,
                    txtDNI.Text, txtLegajo.Text, txtTelefono.Text, txtCelular.Text, txtWeb.Text, txtMail.Text, txtDireccion.Text,
                    "huella", imagePath, barrio, null, "", "", false, null, true);
                
                //Seteando el id del investigador al que se van a actualizar los datos, los demas datos se obtuvieron del formulario
                if (usuario != null)
                {
                    investigador.Id = usuario.Id;
                }

                //PARA ELIMINAR UN INVESTIGADOR, SI TIENE ASISTENCIAS O PERFILES ASIGNADOS SE CAMBIA SU ESTADO SINO SE ELIMINA DE LA DB
                int flagEliminar = 0;
                if (this.operRegla == ReglaBase.Operacion.DELETE)
                {
                    System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("¿Está seguro que desea eliminar el investigador?", "Eliminar", System.Windows.MessageBoxButton.YesNo);
                    if (result == System.Windows.MessageBoxResult.Yes)
                    {
                        flagEliminar = 1;

                        InvestigadorXPerfilDAO invXPerfiles = new InvestigadorXPerfilDAO();
                        List<EntidadBase> perfiles = new List<EntidadBase>();
                        perfiles = invXPerfiles.searchXInvestigador(investigador);

                        AsistenciaDAO daoAsistencia = new AsistenciaDAO();
                        EntidadAsistencia asistencia = new EntidadAsistencia();
                        asistencia = daoAsistencia.ultimoIngreso(investigador.Id);

                        int cantPerfiles;
                        if (perfiles == null)
                        {
                            cantPerfiles = 0;
                        }
                        else
                        {
                            cantPerfiles = perfiles.Count;
                        }

                        if (cantPerfiles > 0 || asistencia != null)
                        {
                            //LE CAMBIO EL ESTADO AL INVESTIGADOR Y NO LO ELIMINO DE LA DB
                            investigador.Activo = false;
                            this.operRegla = ReglaBase.Operacion.UPDATE;
                        }
                        else
                        {
                            //ELIMINO AL INVESTIGADOR DE LA DB
                            this.operRegla = ReglaBase.Operacion.DELETE;
                        }
                    } 
                }
                else
                {
                    flagEliminar = 2; //La operacion que se quiere realizar no es de ELIMINAR
                }

                InvestigadorDAO investigadorDAO = new InvestigadorDAO();
                ReglaBase regla = new ReglaBase(investigador, investigadorDAO, this.operRegla);

                try
                {
                    int id;
                    if (flagEliminar == 1)
                    {
                        id = regla.execute();
                    }
                    else
                    {
                        if (flagEliminar == 2)
                        {
                            id = regla.execute();
                            if (id != 0) investigador.Id = id;
                        }
                    }

                    if (this.operRegla != ReglaBase.Operacion.DELETE && flagEliminar != 1)
                    {
                        foreach (EntidadPerfil perfil in this.perfiles)
                        {
                            EntidadInvestigadorXPerfil invXper = new EntidadInvestigadorXPerfil(
                                investigador.Id, perfil.Id);
                            InvestigadorXPerfilDAO invXperDao = new InvestigadorXPerfilDAO();
                            ReglaBase reglaInvXPer = new ReglaBase(invXper, invXperDao, ReglaBase.Operacion.INSERT);
                            reglaInvXPer.execute();
                        }
                    }
                    
                    switch (operacion)
                    {
                        case Operacion.NUEVO:
                            this.lisBio.notification("Investigador Guardado");
                            break;
                        case Operacion.MODIFICAR:
                            this.lisBio.notification("Investigador Modificado");
                            break;
                        case Operacion.ELIMINAR:
                            if (flagEliminar == 1)
                            {
                                this.lisBio.notification("Investigador Eliminado");
                            }
                            break;
                    }

                    this.btnCancel_Click(sender, e);
                }
                catch (InvalidEntityException exc)
                {
                    System.Windows.MessageBox.Show("Los Datos del Investigador no se han podido guardar.\n" +
                    "Puede que los datos no sean correctos.\nPor favor intentelo nuevamente...", "Datos Investigador");
                }
                catch (Exception exception)
                {
                    System.Windows.MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                    System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("Desea reportar el error?", "Error Desconocido", System.Windows.MessageBoxButton.YesNo);

                    if (result == System.Windows.MessageBoxResult.Yes)
                    {
                        ReportBugs reportar = new ReportBugs();
                        reportar.Show();
                    }
                }
            }
        }

        private void bloquear()
        {
            this.txtNombre.IsReadOnly = true;
            this.txtDNI.IsReadOnly = true;
            this.txtLegajo.IsReadOnly = true;
            this.txtMail.IsReadOnly = true;
            this.txtCelular.IsReadOnly = true;
            this.txtTelefono.IsReadOnly = true;
            this.txtWeb.IsReadOnly = true;
            this.txtDireccion.IsReadOnly = true;
            this.comboBarrio.IsEnabled = false;
            this.btnFoto.IsEnabled = false;

            this.ComboPerfil.IsEnabled = false;
            this.comboProyecto.IsEnabled = false;
            this.btnAgregar.IsEnabled = false;
            this.btnEliminar.IsEnabled = false;
        }

        private void btnFoto_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog();
            open.Filter = "JPF Files (*.jpg)|*jpg";

            if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.fileName = @open.FileName;
                this.cargarImagen();
            }
        }

        private void cargarImagen()
        {
            try
            {
                // Create source
                BitmapImage myBitmapImage = new BitmapImage();

                myBitmapImage.BeginInit();
                myBitmapImage.UriSource = new Uri(this.fileName);

                myBitmapImage.EndInit();

                this.imageFoto.Source = myBitmapImage;
            }
            catch (Exception exc)
            {
                Console.WriteLine("No se puede cargar la Imagen");
                Console.WriteLine(exc.Message);
            }
        }

        private void btnEntrada_Click(object sender, RoutedEventArgs e)
        {
            AsistenciaDAO asistenciaDAO = new AsistenciaDAO();
            EntidadAsistencia asistencia = asistenciaDAO.ultimoIngreso(this.usuario.Id);

            if (asistencia != null)
            {
                if (asistencia.FechaYHoraSalida != null)
                {
                    DateTime date = DateTime.Now;
                    EntidadAsistencia nuevoIngreso = new EntidadAsistencia(date, null, this.usuario, 
                        (EntidadProyecto)this.comboProyectoAsistencia.SelectedItem);
                    ReglaBase regla = new ReglaBase(nuevoIngreso, asistenciaDAO, ReglaBase.Operacion.INSERT);

                    try
                    {
                        regla.execute();
                        this.lisBio.notification("Entrada Registrada");

                        this.lisBio.agregarInvestigadorMenu(this.usuario);

                        this.btnCancel_Click(sender, e);
                    }
                    catch (InvalidEntityException exc)
                    {
                        System.Windows.MessageBox.Show("No se pudo registrar la Entrada", "Asistencia");
                    }
                    catch (Exception exception)
                    {
                        System.Windows.MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                        System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("Desea reportar el error?", "Error Desconocido", System.Windows.MessageBoxButton.YesNo);

                        if (result == System.Windows.MessageBoxResult.Yes)
                        {
                            ReportBugs reportar = new ReportBugs();
                            reportar.Show();
                        }
                    }
                }
                else
                {
                    System.Windows.MessageBox.Show("Antes de registrar el ingreso debe registrar la salida del dia " + asistencia.FechaYHoraEntrada, "Asistencia");
                }
            }
            else
            {
                DateTime date = DateTime.Now;
                EntidadAsistencia nuevoIngreso = new EntidadAsistencia(date, null, this.usuario,
                    (EntidadProyecto)this.comboProyectoAsistencia.SelectedItem);
                ReglaBase regla = new ReglaBase(nuevoIngreso, asistenciaDAO, ReglaBase.Operacion.INSERT);

                try
                {
                    regla.execute();
                    this.lisBio.notification("Entrada Registrada");
                    this.lisBio.agregarInvestigadorMenu(this.usuario);

                    this.btnCancel_Click(sender, e);
                }
                catch (InvalidEntityException exc)
                {
                    System.Windows.MessageBox.Show("No se pudo registrar la Entrada", "Asistencia");
                }
                catch (Exception exception)
                {
                    System.Windows.MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                    System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("Desea reportar el error?", "Error Desconocido", System.Windows.MessageBoxButton.YesNo);

                    if (result == System.Windows.MessageBoxResult.Yes)
                    {
                        ReportBugs reportar = new ReportBugs();
                        reportar.Show();
                    }
                }
            }
        }

        public EntidadInvestigador Usuario
        {
            get { return this.usuario; }
            set { this.usuario = value; }
        }

        public EntidadAsistencia entidadAsistencia
        {
            get { return this.entAsistencia; }
            set { this.entAsistencia = value; }
        }

        public void cargarDatos()
        {
            //Tab Investigador
            this.txtNombre.Text = this.usuario.NombreYApellido;
            this.txtCelular.Text = this.usuario.TelefonoCelular;
            this.txtDireccion.Text = this.usuario.Direccion;
            this.txtDNI.Text = this.usuario.Dni;
            this.txtLegajo.Text = this.usuario.Legajo;
            this.txtMail.Text = this.usuario.Mail;
            this.txtTelefono.Text = this.usuario.TelefonoFijo;
            this.txtCelular.Text = this.usuario.TelefonoCelular;
            this.txtWeb.Text = this.usuario.SitioWeb;
            this.comboBarrio.SelectedValue = this.usuario.Barrio.Id;

            //Tab Proyecto Asociado
            InvestigadorXPerfilDAO invXperDao = new InvestigadorXPerfilDAO();
            List<EntidadBase> lista = invXperDao.searchXInvestigador(this.usuario);

            if (lista != null)
            {
                foreach (EntidadBase entidad in lista)
                {
                    EntidadInvestigadorXPerfil invXper = (EntidadInvestigadorXPerfil)entidad;
                    PerfilDAO perfilDao = new PerfilDAO();
                    List<EntidadBase> perfiles = perfilDao.leerTodas();

                    foreach (EntidadBase entPer in perfiles)
                    {
                        EntidadPerfil perfil = (EntidadPerfil)entPer;
                        if (invXper.FkPerfil == perfil.Id)
                        {
                            TablaElements tabla = new TablaElements();
                            tabla.Descripcion = perfil.Nombre;
                            foreach (EntidadProyecto proyecto in this.comboProyecto.Items)
                            {
                                if (perfil.Proyecto.Id == proyecto.Id)
                                {
                                    tabla.Nombre = proyecto.Nombre;
                                    break;
                                }
                            }
                            List.Items.Add(tabla);
                            this.perfiles.Add(perfil);
                        }
                    }
                }
            }

            //Tab Asistencia
            this.txtNombreAsistencia.Text = this.usuario.NombreYApellido;
            this.txtMailAsistencia.Text = this.usuario.Mail;
            this.txtDniAsistencia.Text = this.usuario.Dni;
            this.textBox1.Text = this.usuario.NombreYApellido;
            this.textBox2.Text = this.usuario.Mail;
            this.textBox3.Text = this.usuario.Dni;

            this.fileName = @usuario.Imagen;
            this.cargarImagen();
        }

        private void btnSalida_Click(object sender, RoutedEventArgs e)
        {
            AsistenciaDAO asistenciaDAO = new AsistenciaDAO();
            EntidadAsistencia asistencia = asistenciaDAO.ultimoIngreso(this.usuario.Id);

            if (asistencia != null)
            {
                if (asistencia.FechaYHoraSalida == null)
                {
                    DateTime date = DateTime.Now;
                    asistencia.FechaYHoraSalida = date;
                    ReglaBase regla = new ReglaBase(asistencia, asistenciaDAO, ReglaBase.Operacion.UPDATE);

                    try
                    {
                        regla.execute();
                        this.lisBio.notification("Salida Registrada");

                        this.lisBio.quitarInvestigadorMenu(this.usuario);

                        this.btnCancel_Click(sender, e);
                    }
                    catch (InvalidEntityException exc)
                    {
                        System.Windows.MessageBox.Show("No se pudo registrar la Salida", "Asistencia");
                    }
                    catch (Exception exception)
                    {
                        System.Windows.MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                        System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("Desea reportar el error?", "Error Desconocido", System.Windows.MessageBoxButton.YesNo);

                        if (result == System.Windows.MessageBoxResult.Yes)
                        {
                            ReportBugs reportar = new ReportBugs();
                            reportar.Show();
                        }
                    }
                }
                else
                {
                    System.Windows.MessageBox.Show("El ultimo egreso ya fue registrado el dia " + asistencia.FechaYHoraSalida , "Asistencia");
                }
            }
        }

        private void comboBarrio_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key != System.Windows.Input.Key.Escape &&
                e.Key != System.Windows.Input.Key.Down &&
                e.Key != System.Windows.Input.Key.Up &&
                e.Key != System.Windows.Input.Key.Left &&
                e.Key != System.Windows.Input.Key.Right &&
                e.Key != System.Windows.Input.Key.Enter)
            {

                this.comboBarrio.IsDropDownOpen = true;

                //COLOCAR EN LUGAR DE NULL LA LISTA QUE SE VA A FILTRAR
                //Util.FilterCombo(this.comboBarrio, null);
            }
        }

        private void listarBarrios()
        {
            BarrioDAO daoBarrio = new BarrioDAO();
            barrios = daoBarrio.leerTodas();

            for (int i = 0; i < barrios.Count; i++)
            {
                comboBarrio.Items.Add((EntidadBarrio)barrios[i]);
            }
            comboBarrio.DisplayMemberPath = "Nombre";
            comboBarrio.SelectedValuePath = "Id";
        }

        private void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            ImageControl image = new ImageControl(this.lisBio);
            image.setDefaultImage();
            this.lisBio.borderControles.Child.IsEnabled = true;
            this.lisBio.borderHuella.Child = image;

            //Listando nuevamente el combo para que se obtengan los investigadores con los datos actualizados
            this.investigadorControl.listarInvestigadores();
        }

        private void btnAgregar_Click(object sender, RoutedEventArgs e)
        {
            if (this.ComboPerfil.SelectedIndex > -1)
            {
                TablaElements tabla = new TablaElements();
                EntidadProyecto proyecto = (EntidadProyecto)this.comboProyecto.SelectedItem;
                EntidadPerfil perfil = (EntidadPerfil)this.ComboPerfil.SelectedItem;
                tabla.Nombre = proyecto.Nombre;
                tabla.Descripcion = perfil.Nombre;

                bool validar = true;
                foreach (TablaElements t in this.List.Items)
                {
                    if (tabla.Nombre == t.Nombre &&
                        tabla.Descripcion == t.Descripcion)
                    {
                        validar = false;
                    }
                }

                if (validar)
                {
                    this.List.Items.Add(tabla);
                    this.perfiles.Add(perfil);
                }
                else
                {
                    System.Windows.MessageBox.Show("Los Datos seleccionados no pueden cargarse\n" +
                        "porque ya se encuentran presentes en la tabla", "Perfil Ya Existente");
                }
            }
            else
            {
                System.Windows.MessageBox.Show("Debe seleccionar un Perfil perteneciente\n" +
                    "al Proyecto seleccionado", "Perfil Faltante");
            }
        }

        class TablaElements
        {
            private string nombre;
            private string descripcion;

            public string Nombre
            {
                get { return nombre; }
                set { this.nombre = value; }
            }

            public string Descripcion
            {
                get { return descripcion; }
                set { this.descripcion = value; }
            }
        }

        private void btnEliminar_Click(object sender, RoutedEventArgs e)
        {
            int pos = this.List.SelectedIndex;
            if (pos != -1)
            {
                this.List.Items.RemoveAt(pos);
                this.perfiles.RemoveAt(pos);
            }
            else
            {
                System.Windows.MessageBox.Show("Debe seleccionar un elemento de la tabla para que pueda ser eliminado.", "Eliminar elemento de Tabla");
            }
        }

        private void BtnGuardarAsis_Click(object sender, RoutedEventArgs e)
        {
            AsistenciaDAO asistenciaDAO = new AsistenciaDAO();
            EntidadAsistencia asistencia = asistenciaDAO.ultimoIngreso(this.usuario.Id);

            if (asistencia != null)
            {
                if (asistencia.FechaYHoraSalida != null)
                {
                    Regex regex = new Regex(@"^(20|21|22|23|[01]d|d)(([:][0-5]d){1,2})$");
                    DateTime? fecha = this.datePicker.SelectedDate;
                    int year = 0;
                    int month = 0;
                    int day = 0;
                    if (fecha != null)
                    {
                        year = fecha.Value.Year;
                        month = fecha.Value.Month;
                        day = fecha.Value.Day;
                    }
                    if (regex.IsMatch(this.txtEntrada.Text))
                    {
                        System.Windows.MessageBox.Show("Hora de Entrada Incorrecta", "Hora Incorrecta");
                        return;
                    }
                    char[] separator = {':'};
                    string[] time = this.txtEntrada.Text.Split(separator);
                    DateTime date = new DateTime(year, month, day, int.Parse(time[0]), int.Parse(time[1]), 0);
                    DateTime? dateSalida = null;
                    if (this.txtSalida.Text != "")
                    {
                        if (regex.IsMatch(this.txtSalida.Text))
                        {
                            System.Windows.MessageBox.Show("Hora de Salida Incorrecta", "Hora Incorrecta");
                            return;
                        }
                        time = this.txtSalida.Text.Split(separator);
                        dateSalida = new DateTime(year, month, day, int.Parse(time[0]), int.Parse(time[1]), 0);
                    }
                    EntidadAsistencia nuevoIngreso = new EntidadAsistencia(date, dateSalida, this.usuario,
                        (EntidadProyecto)this.comboProyectoAsistencia.SelectedItem);
                    ReglaBase regla = new ReglaBase(nuevoIngreso, asistenciaDAO, ReglaBase.Operacion.INSERT);

                    try
                    {
                        regla.execute();
                        this.lisBio.notification("Entrada Registrada");

                        this.lisBio.agregarInvestigadorMenu(this.usuario);

                        this.btnCancel_Click(sender, e);
                    }
                    catch (InvalidEntityException exc)
                    {
                        System.Windows.MessageBox.Show("No se pudo registrar la Entrada", "Asistencia");
                    }
                    catch (Exception exception)
                    {
                        System.Windows.MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                        System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("Desea reportar el error?", "Error Desconocido", System.Windows.MessageBoxButton.YesNo);

                        if (result == System.Windows.MessageBoxResult.Yes)
                        {
                            ReportBugs reportar = new ReportBugs();
                            reportar.Show();
                        }
                    }
                }
                else
                {
                    System.Windows.MessageBox.Show("Antes de registrar el ingreso debe registrar la salida del dia " + asistencia.FechaYHoraEntrada, "Asistencia");
                }
            }
            else
            {
                DateTime date = DateTime.Now;
                EntidadAsistencia nuevoIngreso = new EntidadAsistencia(date, null, this.usuario,
                    (EntidadProyecto)this.comboProyectoAsistencia.SelectedItem);
                ReglaBase regla = new ReglaBase(nuevoIngreso, asistenciaDAO, ReglaBase.Operacion.INSERT);

                try
                {
                    regla.execute();
                    this.lisBio.notification("Entrada Registrada");

                    this.lisBio.agregarInvestigadorMenu(this.usuario);

                    this.btnCancel_Click(sender, e);
                }
                catch (InvalidEntityException exc)
                {
                    System.Windows.MessageBox.Show("No se pudo registrar la Entrada", "Asistencia");
                }
                catch (Exception exception)
                {
                    System.Windows.MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                    System.Windows.MessageBoxResult result = System.Windows.MessageBox.Show("Desea reportar el error?", "Error Desconocido", System.Windows.MessageBoxButton.YesNo);

                    if (result == System.Windows.MessageBoxResult.Yes)
                    {
                        ReportBugs reportar = new ReportBugs();
                        reportar.Show();
                    }
                }
            }
        }

    }
}
